In conventional adaptive streaming, a video stream is divided into short segments of a few seconds each, with segments being encoded (or transcoded) from a master high-quality source at several different bitrates and the output stored at a server from which clients fetch the segments. A common practice is for the encoder/transcoder to employ constant-bitrate (CBR), resulting in a set of tiers, or “levels” of video output. A client application downloads the segments from the server (often sequentially) using HTTP GET requests, estimates the available bandwidth using measurements of the download performance, and selects the video level of the next segment to fetch at the completion of the prior segment.
Typically, tens of seconds of downloaded video segments are buffered at the client to accommodate bandwidth fluctuations. A viable rate adaptation algorithm achieves high average video quality, low variation of video quality, and low probability of video playout stalls caused by buffer underruns.